package org.elsfs.cloud.common.mybatis.ext.sql.support.common;



import lombok.RequiredArgsConstructor;
import org.elsfs.cloud.common.mybatis.ext.sql.TableAliasManager;
import org.elsfs.cloud.common.util.lang.StringUtils;

/**
 * 层级表别名管理器
 *

 */
@RequiredArgsConstructor
public class HierarchyTableAliasManager implements TableAliasManager {

    /**
     * 代理表别名管理器
     */
    private final TableAliasManager delegate;
    /**
     * 父级表别名管理器
     */
    private final TableAliasManager parent;

    /**
     * 生成表别名
     *
     * @param entityClass 表实体类
     * @return 别名
     */
    @Override
    public String generateAlias(Class<?> entityClass) {
        return this.delegate.generateAlias(entityClass);
    }

    /**
     * 生成表别名
     *
     * @param table 数据库表名
     * @return 别名
     */
    @Override
    public String generateAlias(String table) {
        return this.delegate.generateAlias(table);
    }

    /**
     * 注册表别名
     *
     * @param entityClass 表实体类
     * @param alias       别名
     */
    @Override
    public void registerAlias(Class<?> entityClass, String alias) {
        this.delegate.registerAlias(entityClass, alias);
    }

    /**
     * 注册表别名
     *
     * @param table 数据库表名
     * @param alias 别名
     */
    @Override
    public void registerAlias(String table, String alias) {
        this.delegate.registerAlias(table, alias);
    }

    /**
     * 获取表别名
     *
     * @param entityClass 表实体类
     * @return 表别名
     */
    @Override
    public String fetchTableAlias(Class<?> entityClass) {
        String alias = this.delegate.fetchTableAlias(entityClass);
        if (StringUtils.isBlank(alias)) {
            alias = this.parent.fetchTableAlias(entityClass);
        }

        return alias;
    }

    /**
     * 获取表别名
     *
     * @param table 数据库表名
     * @return 表别名
     */
    @Override
    public String fetchTableAlias(String table) {
        String alias = this.delegate.fetchTableAlias(table);
        if (StringUtils.isBlank(alias)) {
            alias = this.parent.fetchTableAlias(table);
        }

        return alias;
    }
}
